AWS Transfer for SFTPのIAMなどの権限周りを整理してみた #reinvent
コンニチハ、千葉です。
AWS Transfer for SFTPを早速導入します!(宣言) で、運用考慮した時にどんな権限を考慮する必要があるか整理してみました。
ユーザー認証
まずは、ユーザー認証です。SFTPサーバー作成時に、Identity providerを選択できます。
- マネージド
- カスタム
マネージドを選択する場合は、Transfer for SFTPのマネージメントコンソールからユーザーをさくっと追加することができます。この方法が一番簡単です。カスタム認証を利用するときは、CFnのサンプルが用意されているので参考にしましょう。こちらを利用するとAPI Gateway側の機能を利用できます。たとえば、Cognitoを利用したり、既存のIdpとの統合が可能です。
ファイルアクセスの権限(IAM)
ユーザーは、IAMポリシーにしたがってどのS3バケット、どのキーにアクセスできるかを定義します。設定画面上、IAMポリシーの設定箇所が2箇所あります。
- アクセス:S3バケットの可能な操作(追加、更新、削除、参照)
- スコープダウン:バケットのユーザーを一部に割り当てる場合、たとえばホームディレクトリのみアクセスさせるなど
って感じなので、全体的なS3アクセスに関してはアクセスの箇所に、個別のユーザーに関する制限についてはスコープダウンに指定しましょう。 例えば、アクセスは特定のバケットにFullAccessを指定、スコープダウンでは、ユーザーに対しては自分のホームディレクトリのみ参照、書き込みできるなど。そうすると、管理者みたいなSFTPユーザーを作成しつつ(スコープダウンポリシー指定しない)、他のユーザー(スコープダウンポリシーを指定する)には参照だけとか、柔軟に権限を与えられそうです。
またスコープダウンポリシーでは、変数を指定できるので、ユーザーごとにポリシーを作成せず1つのポリシーで対応できます。
- ${transfer:UserName}
- ${transfer:HomeBucket}
- ${transfer:HomeDirectory}
サンプルです
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ListHomeDir", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::${transfer:HomeBucket}" }, { "Sid": "AWSTransferRequirements", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Resource": "*" }, { "Sid": "HomeDirObjectAccess", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObjectVersion", "s3:DeleteObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*" } ] }
このサンプルの例だと以下のようになります。
- ホームディレクトリのリスト表示許可
- S3バケット一覧とバケットのロケーションを取得許可
- ホームディレクトリのput/get/delete(バージョン含め)を許可
忘れずにIAMロールには以下の信頼関係を追加しましょう。これがないとエラーになります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "transfer.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": {} } ] }
SSHキー
macOSやその他UNIXOSで、SSHキーペアを作成します。ユーザー作成時に、公開鍵を登録します。秘密鍵はアクセス時に使用しましょう。
ssh-keygen -P "" -f transfer-key
最後に
情報が整理できました。特にIAMポリシー2箇所あるけど、どう指定するの?っていう疑問がクリアになったのでよかったです。re:Invent行く前にS3にSFTP接続したいって問い合わせがきていたので、Transfer for SFTPはとってもタイムリーなサービス追加でした!!